# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/27 20:33 
@Author  : ZhangShenao 
@File    : private_field_and_method.py 
@Desc    : 私有属性与私有方法
通过双下划线前缀__,可以将类属性或方法声明为私有的
私有的属性和方法只能在类内部访问,在类外部无法访问
有时也使用但下划线_前缀来声明某属性或方法是私有的,但是这种形式只是一种使用者间的约定,并不在解释器层面作限制
"""


class MyClass:
    # 定义私有类属性
    __private_field = 'private field'

    # 定义私有类方法
    @classmethod
    def __private_class_method(cls):
        """
        私有类方法
        """

        # 在类内部,可以访问私有类属性和私有类方法
        print(f'invoke private class method, private field is {cls.__private_field}')

    @classmethod
    def public_class_method(cls):
        """
        公共类方法
        """

        # 在类内部,可以访问私有类属性和私有类方法
        print(f'invoke public class method, private field is {cls.__private_field}')


if __name__ == '__main__':
    # 在外部无法访问私有类属性,会抛出AttributeError异常
    # print(MyClass.__private_field)  # AttributeError: type object 'MyClass' has no attribute '__private_field'

    # 在外部无法调用私有类方法,会抛出AttributeError异常
    # MyClass.__private_class_method()  # AttributeError: type object 'MyClass' has no attribute '__private_class_method'

    # 在外部可以调用公共类方法
    MyClass.public_class_method()  # invoke public class method, private field is private field
